/*
 * @Description: 监测对象的每层数据变化
 * @Author: wangqi
 * @Date: 2021-05-23 09:56:38
 * @LastEditTime: 2021-06-06 11:52:21
 */
import { def } from './utils'
import observe from './observe'
import { arrayMethods } from './array'
import defineReactive from './defineReactive'
import Dep from './Dep'

export default class Observer {
    constructor(value) {
        // 相当于给每个实例对象都加上了一个 key为 __ob__  值为 new Observer() 的属性
        // 主要给数组用，让其在拦截器中触发依赖，以及用来标记当前value 是否已经被Observer转成响应式数据了 [observer.js 中做了判断]
        def(value, '__ob__', this, false);
        
        // 相当于给每个实例对象都加上了一个 dep 属性
        this.dep = new Dep();

        if (Array.isArray(value)) {
            // 修改数组的 原型 __proto__ 对象指向
            Object.setPrototypeOf(value, arrayMethods);
            // 让数组变成响应式
            this.observeArray(value);
        } else {
            this.walk(value);
        }
    }

    // 对象：遍历value具体每层对象形成响应式
    walk(value) {
        for (let k in value) {
            defineReactive(value, k);
        }
    }

    // 数组：形成响应式
    observeArray(arr) {
        for (let i = 0, len = arr.length; i < len; i++) {
            // 数组中的每一项可能子数组, 也让其成为响应式
            observe(arr[i]);
        }
    }

}


